package modelo;

import java.util.TreeSet;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedList;
import java.io.File;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.io.IOException;

public class Seccion 
{
    private int nroSeccion;
    /*declara a una Coleccion que ordena a estudiantes, y no los repite*/
    private TreeSet<Estudiante> estudiantes;
    private Profesor profesor;
    private boolean evaluacionesAplicadas; /*Sirve para vaidar que se presentaron las evaluaciones
                                             asi se hayan retirado todos los estudiantes
                                             */

    public Seccion()
    {
        estudiantes =  new TreeSet<Estudiante>();
        nroSeccion= 2;
        evaluacionesAplicadas= false;
    }
            
    public int getNroSeccion() {
        return nroSeccion;
    }

    public void setNroSeccion(int nroSeccion) {
        this.nroSeccion = nroSeccion;
    }

    public Profesor getProfesor() {
        return profesor;
    }

    public void setProfesor(Profesor profesor) {
        this.profesor = profesor;
    }

    public TreeSet<Estudiante> getEstudiantes() {
        return estudiantes;
    }

    public void setEstudiantes(TreeSet<Estudiante> estudiantes) {
        this.estudiantes = estudiantes;
    }


    public boolean inscribirEstudiante(Estudiante estudiante)
    {
        return estudiantes.add(estudiante);
    }
    
    public boolean retirarEstudiante(Estudiante estudiante)
    {
        return estudiantes.remove(estudiante);
    }
    
    public Estudiante buscarEstudiante(String cedula)
    {

       //LinkedList es otro tipo de objeto Colleccion
       LinkedList<Estudiante> lista= new LinkedList<Estudiante>(estudiantes);
       /*Realiza una busqueda binaria del Estudiante
         si el estudiante es encontrado retorna un numero positivo que representa
         el indice en el que se encuentra en el LinkedList, si no se encuentra retorna
         un numero negativo
        */
       int indice= Collections.binarySearch(lista, new Estudiante(cedula,"",""));
       
       Estudiante objEstudiante=null;
       
       if (indice >= 0)
           objEstudiante= lista.get(indice);

       return objEstudiante;
    }



    public TreeSet<Estudiante> generarReporteEstudiantesCedula()
    {
        return this.estudiantes;
    }        
    
    public void aplicarEvaluaciones()
    {
        for (Estudiante objEstudiante:estudiantes)
        {
            objEstudiante.presentarEvaluaciones();
            profesor.evaluarEstudiante(objEstudiante);
        }
        evaluacionesAplicadas= true;
    }

    public boolean isEvaluacionesAplicadas() {
        return evaluacionesAplicadas;
    }

    
 
    public Collection<Estudiante> generarReporteEstudiantesAprobados(){
        TreeSet<Estudiante> set= new TreeSet<Estudiante>();
            
        for (Estudiante objEstudiante:estudiantes)       
           if(objEstudiante.isStatus())
                set.add(objEstudiante);
        
        return set;
    }
    
    public Collection<Estudiante> generarReporteEstudiantesAplazados()
    {
      TreeSet<Estudiante> set= new TreeSet<Estudiante>();
      
      for (Estudiante objEstudiante:estudiantes)       
           if(!objEstudiante.isStatus())
                set.add(objEstudiante);
      
      return set;
    }
    
    public float getPromedioNotas(){
        float total = 0.0f; 
        for (Estudiante objEstudiante:estudiantes)
            total += objEstudiante.getNotaFinal();
        
        if (estudiantes.size() > 0)
           total /= estudiantes.size();
        
        return Math.round(total);
    }

   /*genera una coleccion de estudiantes ordenados por nota final*/
   public Collection<Estudiante> generarEstudianteNotaFinal()
   {
      LinkedList<Estudiante> estudiantesNotaFinal = new LinkedList<Estudiante>(estudiantes);

       //Ordena los estudiantes segun su nota final
       Collections.sort(estudiantesNotaFinal, new ComparadorNotaFinal());
       
       return estudiantesNotaFinal;
   }
   
   public void imprimirReportePantalla(Collection<Estudiante> coleccion, String titulo,String pieReporte)
   {
       System.out.println(titulo);
       System.out.println();
       
       for (Estudiante objEstudiante:coleccion)
            System.out.println(objEstudiante);

       System.out.println(pieReporte);
   }

   /*Imprime un reporte en el archivo*/
   public void imprimirReporteArchivo(File archivo,Collection<Estudiante> coleccion,String titulo,String pieReporte) throws IOException
   {
      //Flujo de salida al archivo de texto
      PrintWriter out= new PrintWriter(new BufferedOutputStream(new FileOutputStream(archivo)));

      out.println("              " + titulo);
      out.println();
      out.println();

      for (Estudiante objEstudiante:coleccion)
      {
          out.println(objEstudiante);
          out.println();
      }

      out.println();
      out.println(pieReporte);
      out.println();
      //Imprime la fecha y la hora en que se imprime el reporte
      out.println(String.format("Reporte creado el %1$td/%1$tm/%1$tY a las %1$tI:%1$tM %1$tp",java.util.Calendar.getInstance()));
      out.close();
      
   }
   
 }